// 泛型函数
function testFn<T>(arg: T): T {
    return arg
}

let resultString = testFn<String>('哈哈哈');  // 手动传入参数类型
let resultNum = testFn(42); // Typescript会自动推断出T是number

// 泛型接口
interface testFn<T> {
    id: (params: T) => T
    ids: () => T[]
}

// 使用泛型接口时,必须需要显式指定具体的类型
const obj: testFn<number> = {
    id(num) {
        return num
    },
    ids() {
        return [1, 2]
    }
}

// 泛型类
class GenericNumber<T> {
    zeroValue: T
    add: (x: T, y: T) => T
    constructor(zero: T, add: (x: T, y: T) => T) {
        this.zeroValue = zero;
        this.add = add;
    }
    zero(): T {
        return this.zeroValue;
    }
    addNumbers(x: T, y: T): T {
        return this.add(x, y);
    }
}

let myGenericNumber = new GenericNumber<number>(0, (x, y) => x + y);